今天打開通知突然發現自己關注的系列好像有點多...原本想說把每一篇看過的都寫一下心得,但有些篇幅滿少的,所以也沒什麼心得可以打。於是我決定之後就只講一下我看過而且有心得可以分享的文章。
今天還滿巧的,有滿多人的文章都有一些關聯,例如說 【JavaScript 核心】陳述式與表達式與從StackOverflow上學CODING(6)宣告一個變數並賦予一個函式值與建立一個函示並命名的差別,兩者雖然不太一樣,但整體來說還是類似的。
前者的重點大概就是 ASI,Automatic Semicolon Insertion,一個自動幫你插入分號的機制。當初我會研究到這個其中一個原因是看到 StandardJS 預設的規則是不用分號,而且跟你說:「不用分號真的 OK,你只要注意幾種狀況就好」
一種最常見的就是:
return
{
a: 1
}
會因為 ASI 變成:
return;
{
a: 1
}
回傳的值就變成 undefined 了,跟預期中的不同。只要多留意幾種情況,不用分號也是 ok 的。
然後有關於陳述式與表達式,對新手來說最常見的應該就是 devtool 上的 undefined
有些人會誤以為那個 undefined 是回傳的結果,但其實是因為陳述式的緣故。
然後 function expression vs function declaration 那篇其實我也滿好奇在實作上的差異,我的意思是說,有沒有哪種情況是建議用 A 而不用 B,或者是顛倒過來。
接著一樣是類似的主題,這兩篇都談到了 JS 的 GC:【JavaScript 核心】記憶體 & 同步、非同步、Day6 [JavaScript 基礎] 垃圾回收機制。
其實裡面附的 MDN 參考資料講得滿清楚,常見的好像就兩個機制,第一個是 Reference-counting garbage collection,簡單來說就是去記每個 object 有多少人指向它,如果是 0 的話就代表沒人用,就可以回收掉了。不過有個解不掉的案例是循環引用,這個剛好在上一篇還是上上篇講到深拷貝的時候有提到。
第二個是 Mark-and-sweep algorithm,核心概念是「找不到的物件就是不需要的物件」,從 root(global 物件)延伸出去一直往下找,找遍所有的東西之後,沒找到的那些就是不需要的,就可以回收掉了。
在上面後面那篇文中提到的「閉包記憶體洩漏」其實我覺得有點奇怪,因為那個案例看起來跟閉包好像沒什麼關係,純粹是因為沒有宣告所以變成全域變數而已。
function createAdder(a) {
const veryBig = Array(999999).fill('*********')
return function add(b) {
return a + b
}
}
const add3 = createAdder(3)
console.log(add3(5)) // 8
這個好像會比較像跟閉包有關,雖然說程式跑完會把 veryBig 回收掉,但如果 add3 因為某些不當操作沒有被 GC,那 veryBig 也不會被回收掉。
最後要來提的兩篇文章都跟陣列有關,第一篇是似乎不是唯一解 - 陣列(array) * 函式(function),雖然說是練習函式的使用,但搭配了全域變數總覺得有點怪怪的(?)
然後是 [LeetCode] Array,第一題文中給的最終解法有點小奇怪:
var sortArrayByParity = function(A) {
// 先處理極限值
if(A.length < 2){
return A
};
// 把想法變成程式碼實踐
let temp = []
A.filter( item => {
item%2==0 ? temp.unshift(item) : temp.push(item)
})
return temp
};
奇怪的第一個點是針對 A.length < 2 的情形,應該不用特別做處理。第二個點是 filter 不該這樣用,如果是面試的話應該會被問說:「為什麼這邊要用 filter?」,比較好的做法是用 foreach 或是 for loop 就好,因為你本來的目的就是遍歷陣列,而不是想要過濾掉東西。
第二題 Array Partition I 的時間複雜度算錯,已經留言給建議了,因為有排序所以應該是 O(nlogn) 而不是 O(n)。
好,今天就這樣了。以下是本日遊記。
今天午餐懶得出門,叫了 uber eats 來吃,這邊除了 uber eats 以外也有 deliveroo,也有本地的 App 但我沒有去記是哪些。吃完之後就維持原訂計畫,搭車回阿布達比,一樣又搭了兩個小時的巴士。
我去法國的飛機是隔天凌晨兩點,機場通常三個小時最多四小時前開櫃,也就是說我必須提著行李一直到晚上十點!這怎麼可能,於是我之前就私訊去問 etihad 臉書小編(臉書超好用,比打電話方便多了),得到了一個超棒的答案:city check in,簡單來說阿提哈德在市區提供了兩個點可以 check in,飛機出發的 24 ~ 4 小時前都可以使用,一個人要付 30 塊 AED 的服務費,大概就台幣 250。
大概長這樣:
在 check in 的時候看到地勤翻了翻我的護照,我就知道:「來了,要被問那個問題了!」
地勤:「Where is your visa to Paris?」
我:「I think I don't need a visa to Paris, you see China on my passport, but it's actually Taiwan」
然後他就手忙腳亂一陣,後來跟我說根據我的護照號碼,沒錯,我不用護照。真是可喜可賀,幸好系統都查得到,不然還要再解釋一波。然後他跟我說在系統裡面其實是寫 Chinese Taipei,原來是這樣。
託運完行李之後就去阿布達比之旅的最後一個景點:謝赫扎耶德大清真寺 (Sheikh Zayed Grand Mosque)。
是很有名的一個景點,實際去看過之後也真的滿壯觀的:
雖然本來就知道這是個觀光景點,但畢竟它也是一個清真寺,原本我預期會跟我上次去印尼雅加達的清真寺一樣,有那種氣氛(就是宗教感很重的那種氣氛,你會融入在裡面),但這邊完全沒有。可能是因為真的 worship 的地方我沒有去到,才有這種感覺。就感覺那邊到處都是觀光客,建築本身是很壯觀沒有錯,但少了人的味道。
在前往機場的 Uber 上我想到了這個比喻,大概就像是沒有香的廟吧,或者是說幾乎沒有人拜拜的廟,大家都是去那邊看「廟」這個建築的。
總之我 right now 人在阿提哈德的貴賓室(因為我搭商務艙),門面沒有想像中厲害:
但進去之後發現很大,不過我寫這篇文章寫一個半小時,轉頭才發現人變超級多,剛來的時候大概整場十個人以內,現在大概快一百個人 = =
再三個小時(還好久...)就要搭飛機去巴黎囉~